別の TCP 接続を確立してクライアントがリクエストを送信する場合でも、アイドルタイムアウトが発生するか教えてください
困っていること
ALB を利用しています。クライアント - ALB 間および、ALB - ターゲット間で TCP 接続が確立し、ターゲットがリクエストを受け取ってからレスポンスを返すまでに時間がかかっており、アイドルタイムアウトが発生します。
別の TCP 接続を確立してクライアントがリクエストを送信する場合でも、アイドルタイムアウトが発生するか教えてください。
どう対応すればいいの?
結論から言うと、アイドルタイムアウトが発生します。
説明
クライアント - ALB 間、ALB - ターゲット間で TCP 接続が確立されたのち、一定時間データのやりとりがなければ接続が切断され、これをアイドルタイムアウトといいます。
データのやり取りがない場合に接続が切断されるまでの時間については、ALB で設定するものとターゲット側のアプリケーションで設定するものがございます。それぞれを以下とします。
- ALB のアイドルタイムアウト値
- ターゲットのアイドルタイムアウト値
クライアント - ALB 間、ALB - ターゲット間で TCP 接続が確立されたのちに、ALB のアイドルタイムアウト値およびターゲットのアイドルタイムアウト値を経過する前に "同じ" TCP 接続に対してデータの送受信があった場合 アイドルタイムアウトを回避可能です。
しかしながら、例えばヘルスチェックによる別 TCP 接続に対する通信が発生した場合、既存の TCP 接続のアイドルタイムアウトを回避することは叶いません。
回避方法
アイドルタイムを回避するには、アイドルタイムアウトを回避したい TCP 接続に対して少なくても 1 バイトのデータを送受信してください。必要に応じてアイドルタイムアウトの長さを増やすことをご検討ください。
なお、仮に「ELB のアイドルタイムアウト値」が 60 秒で設定している場合、「ターゲットのアイドルタイムアウト値」は 60 秒よりも大きい時間に設定してください。ターゲットのアイドルタイムアウト値を、ELB の値より⻑く設定していない場合、ロードバランサーの "HTTP 504 エラー"
が発生する可能性があります。
クライアントがロードバランサーを通じて行うリクエストごとに、ロードバランサーは 2 つの接続を維持します。フロントエンド接続は、クライアントとロードバランサーの間にあります。バックエンド接続は、ロードバランサーとターゲットの間です。ロードバランサーには、その接続に適用される設定済みのアイドルタイムアウト期間があります。アイドルタイムアウトが経過するまでデータが送受信されなかった場合、ロードバランサーは接続を閉じます。ファイルのアップロードなどの長いオペレーションで、完了までの時間を確保するため、各アイドルタイムアウト期間が経過するまでに少なくても 1 バイトのデータを送信し、必要に応じてアイドルタイムアウトの長さを増やします。